
//材料模型
map gameItemsMode = ({
    "100001":({
        "name":"面包",
        //购买需要
        "cost":"5",
        //生产需要10s
        "buildTime":10
    }),
    "100002":({
            "name":"牛奶",
            //购买需要
            "cost":"5"
    })
});


//住宅10001
//水塔10002 20人口时，启动水源的需求 一个水塔可供50人口 极限100人口 负荷超过60% 人口下降

//什么启动工作需求系统

map UNIT_T = ({
    //住宅
    "ZHU_FANG":1,
    //水塔
    "SHUI_TA":2

});





//水塔是否超过负荷
int calcShuiTaLimit(string uid) {

    int limit_popult = 50;        // 水塔极限人口
    int limit_rate = 0.6;    // 负荷阈值百分比
    int shuiTaNum;     //当前水塔的数量

    // 当前人口
    var currentPopulation = getPopUltWorker(uid);
    shuiTaNum = getUnitCount(uid,this.UNIT_T.SHUI_TA);

   var loadPercentage = (currentPopulation / (limit_popult * shuiTaNum)) * 100;
   // 判断是否超过负荷阈值
   if (loadPercentage > limit_rate * 100) {
        string s = fmt("当前水资源比例 %s > %s ",toStr(loadPercentage),toStr(limit_rate * 100));
        println( s );
        return 1;
   }else{
        return 0;
   }

}

//建筑结构
map buildings=({
    //建筑名称
    //建筑类型 住宅 警察局
    //是否有需求
    //具体的需求有那些,是个数组
    //初始创建时的要求
    //升级要求
    //可以产出什么
    //多少个生产线
    //生产线正在生产什么
    //开始生产时间，结束生产时间
    //需求满意度 100
    //抽象(人口数量)
});

//需求包
map needPacket = ({
    //需求ID 某个单位(食品ID，材料ID)的具体ID
    //需求数量
    //需求发生时间
    //需求满足时间
});



//玩家的所有数据
map userData=({
    //玩家ID
//    "10000":({
//        //金钱
//        "money":0,
//        "buildings":([])
//    })
});

//创建建筑单位
int buildUnit(object me, string unitId){

    string name = "";
    if( unitId == "10002" ){//水源
        name = "水塔"+getUnitCount(me.query("id"),this.UNIT_T.SHUI_TA);
        this.userData[me.query("id")]["buildings"]+=({
                      "name":name,
                      "type":this.UNIT_T.SHUI_TA,//2是水塔
                      //可提供的工作量
                      "popult":4,
                      //已有几个人工作？
                      "worker":0
         });
         tellObject(me,name+"创建成功!可以提供4个岗位");
    }else if(unitId == "10001" ){

        name = "住房"+getUnitCount(me.query("id"), this.UNIT_T.ZHU_FANG);
        this.userData[me.query("id")]["buildings"]+=({
                  "name":name,
                  "type":this.UNIT_T.ZHU_FANG,
                  "popult":8,
                  //已有几个人
                  "worker":0
         });

         var zf = new("obj/slg/home");
         zf.set("long", name);
         this.userData[me.query("id")]["units"]+=({
               "id":hashCode(zf)
         });

         tellObject(me, name+"创建成功!可以提供8个人居住,等会儿就有移民领包入住了。");
    }
}


//获取单位的数量
int getUnitCount(string uid,int unitType){
     map *bud = this.userData[uid]["buildings"];
     int c;
    foreach(  v in bud ){
        if( v.type == unitType  ){
           c++;
        }
    }
    return c;
}

//制造需求
void createNeed(string uid){

    map *bud = this.userData[uid]["buildings"];
    foreach(  v in bud ){
        if( v.type==1 && random(1,6) == 5  ){
            //生成需求
            println("需要白糖!");
        }
    }
}

//获取人口上限
int getPopUlt(string uid){

    map *bud = this.userData[uid]["buildings"];
    int c = 0;

    foreach(  v in bud ){
        if( v.type == 1 ){
            c+=v.popult;
        }
    }
    return c;
}

//获取实际的居民数量
int getPopUltWorker(string uid){
    map *bud = this.userData[uid]["buildings"];
    int c = 0;
    foreach(  v in bud ){
        if( v.type == 1 ){
            c+=v.worker;
        }
    }
    return c;
}

//减少人口
void subPopUlt(string uid){

    map *bud = this.userData[uid]["buildings"];
    foreach(  v in bud ){
        if( v.type==1 && v.worker > 0  ){
            v.worker-=1;
            println(fmt("%s 的市民离开了...",v.name));
            break;
        }
    }
}



//随机增加某个住宅的人口
void addPopUlt(string uid){

    map *bud = this.userData[uid]["buildings"];
    int waterErrNo;
    if( getPopUltWorker(uid) >= getPopUlt(uid) ){
        println("住房太少，影响了移民进入城市。");
        return;
    }


    if( (waterErrNo = checkWater(uid)) < 0){
        if( waterErrNo==-1 ){
            println("城市需要水源,没有水源影响移民进入。");
            return;
        }else if(waterErrNo==-2){
            println("水资源紧张,有市民开始离开....");
            subPopUlt(uid);
            return;
        }

    }



    foreach(  v in bud ){
        if( v.type==1 && v.worker < v.popult  ){
            v.worker+=1;
            println("遥远的天际，新居民涌入，城市焕发新生机。");
            break;
        }
    }
}


void addMoney(string uid,int n){
    this.userData[uid]["money"] += n;
}

void getUserMoney(string uid){
    return  this.userData[uid]["money"];
}


int regGame(object me){


    this.userData[me.query("id")]=({
          "money":0
    });
    this.userData[me.query("id")]["buildings"] = ([]);
    this.userData[me.query("id")]["units"] = ([]);
    println( this.userData);

}


//游戏时间 120s为现实世界1小时
//2880s=24小时
//3s为一分钟
int gameTime1;
int gameTime2;
int gameTime3;
int gameTimeH;

void updateHour(){

    if(this.gameTime2 > 59){//游戏中一个小时
          this.gameTimeH+=1;
          this.gameTime2=0;
          println(fmt("游戏世界过去%d小时",this.gameTimeH));
            var hour = this.gameTimeH;
             if (hour >= 0 && hour < 5) {
                println("凌晨时分，星辰低垂");
              } else if (hour >= 5 && hour < 9) {
                println("晨光初破，晓色朦胧");
              } else if (hour >= 9 && hour < 12) {
                println("朝霞满天，生机勃勃");
              } else if (hour >= 12 && hour < 14) {
                println("正午烈日，光影交错");
              } else if (hour >= 14 && hour < 18) {
                  println("午后时光，悠然自得");
              } else if (hour >= 18 && hour < 20) {
                  println("夕阳西下，晚霞似锦");
              } else if (hour >= 20 && hour < 23) {
                  println("黄昏降临，夜色渐浓");
              } else { // hour === 23
                  println("深夜静谧，月挂中天");
              }
        }else{
              this.gameTime2+=1;
        }
}

int checkWater(string uid){

    if( getPopUltWorker(uid)>=10  ){//检查水塔使用情况
        if(getUnitCount(uid,this.UNIT_T.SHUI_TA)<=0){
            //println("城市需要水源,水塔可以为市民提供大量水源。");
            return -1;

        }else if(calcShuiTaLimit(uid)){
            return -2;
            //println("水资源紧张,有市民开始离开....");
        }
        return 1;
    }

}

//游戏世界时间:每分钟更新一次
void updateMinutes(){

//  if( this.gameTime3 > 2 ){
//      this.gameTime3=0;
//  }





    var dataKeys = keys(this.userData);

    foreach(uid in dataKeys){

//        //水塔使用情况
//        if( getPopUltWorker(uid)>=10  ){//检查水塔使用情况
//            if(getUnitCount(uid,this.UNIT_T.SHUI_TA)<=0){
//                println("城市需要水源,水塔可以为市民提供大量水源。");
//
//            }else if(calcShuiTaLimit(uid)){
//                println("水资源紧张,有市民开始离开....");
//            }
//        }



       map untis = this.userData[uid]["units"];

        foreach( u in untis ){
           object e = findObjectHash ( u["id"] );
           if( e ){
              println("OBJ ---------"+e.query("long"));
           }
        }




       if(random(1,6)==5){
          int popult = getPopUlt(uid);
          println(fmt("城市正在发展中 人口:%d",popult));
          int shuishou = toInt(popult * 0.02);

          if( shuishou <=0 ) return;
          shuishou = 1 + random(0,shuishou);
          addMoney(uid,shuishou);
          println(fmt("uid:%s=城市得到税金:%d,",uid,shuishou));
      }


        //增加人口
        addPopUlt(uid);

        println(fmt("uid:%s=目前 人口:%d/%d,余额:%d 居民满意度:%d",uid,getPopUltWorker(uid),getPopUlt(uid),getUserMoney(uid),10000));
    }


//this.gameTime3+=1;


}


void heartbeat(){
    //游戏中1分钟更新一次


    if(this.gameTime1 > 2){//>1 就是等于3 1分钟

        updateHour();
        this.gameTime1=0;
        updateMinutes();
        return;
    }


    this.gameTime1+=1;
}
